package es.tikitaka.actions.jugadores;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jooreports.templates.DocumentTemplateException;
import net.sf.jooreports.templates.ZippedDocumentTemplate;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.DocumentFormatRegistry;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;

import es.tikitaka.domain.jugador.Jugador;
import es.tikitaka.domain.jugador.PartJugador;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("exportJugador")
@Scope(ScopeType.CONVERSATION)
public class ExportarFichaJugadorAction {

	private ZippedDocumentTemplate z;
	private StringBuffer temporada;
	private String nombre;
	private StringBuffer nombreCompleto;
	private String fechaNacimiento;
	private StringBuffer lugarNacimiento;
	private String demarcacion;
	private StringBuffer estaturaPeso;
	private String equipoAct;
	private String nombreFoto;
	private List<String> historia;
	private List<String> palmares;

	/**
	 * Constructor por defecto
	 */
	public ExportarFichaJugadorAction() {
	}

	/**
	 * Método para generar un pdf con los datos del jugador
	 * 
	 * @param jugador
	 *            Jugador para el que se genera el pdf
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public int exportFichaJugadorPdf(Jugador jugador) {

		Map map = new HashMap();

		List<PartJugador> participaciones = new ArrayList<PartJugador>();
		participaciones.addAll(jugador.getM_jugadores());
		Collections.sort(participaciones);

		PartJugador participacion = participaciones
				.get(participaciones.size() - 1);

		// Creamos las variables
		temporada = new StringBuffer();
		nombre = new String();
		nombreCompleto = new StringBuffer();
		fechaNacimiento = new String();
		lugarNacimiento = new StringBuffer();
		demarcacion = new String();
		estaturaPeso = new StringBuffer();
		equipoAct = new String();
		historia = new ArrayList<String>();
		palmares = new ArrayList<String>();
		nombreFoto = new String();

		// Rellenamos los datos del jugador para añadirlo a la plantilla
		temporada.append("Temporada ").append(
				participacion.getTemporada().getAnio().getAnio());
		nombre = jugador.getNombre();
		nombreCompleto.append(jugador.getApellidos()).append(", ").append(
				jugador.getNombre());
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		fechaNacimiento = sdf.format(jugador.getFechaNac()).toString();
		lugarNacimiento.append(jugador.getMunicipio().getMunicipio()).append(
				", ").append(jugador.getProvincia().getProvincia());
		demarcacion = participacion.getPosicion().getPosicion();
		estaturaPeso.append(participacion.getAltura()).append(" m / ").append(
				participacion.getPeso()).append(" kg");
		equipoAct = participacion.getEquipo().getEquipo().getNombre();

		// Vemos el historial de equipos del jugador y su palmarés
		for (PartJugador part : participaciones) {
			StringBuffer hist = new StringBuffer();
			StringBuffer palm = new StringBuffer();
			// historial
			hist.append(part.getEquipo().getEquipo().getNombre());
			hist.append(" (");
			hist.append(part.getTemporada().getAnio().getAnio());
			hist.append(")");
			historia.add(hist.toString());
			// palmarés
			if (part.getTitulo() != null) {
				palm.append(part.getTitulo().getTrofeo().getTrofeo());
				palm.append(" (");
				palm.append(part.getTemporada().getAnio().getAnio());
				palm.append(")");
				palmares.add(palm.toString());
			}
			if (part.getEquipo().getTitulo() != null) {
				palm = new StringBuffer();
				palm.append(part.getEquipo().getTitulo().getTrofeo()
						.getTrofeo());
				palm.append(" (");
				palm.append(part.getTemporada().getAnio().getAnio());
				palm.append(")");
				palmares.add(palm.toString());
			}
		}
		// vemos si el jugador tiene una foto subida
		if (participacion.getJugador().getFoto() != null) {
			// tiene una foto subida
			nombreFoto = "fotoJugador.png";
			// metemos la foto en la carpeta /Pictures de la plantilla
			URL ur = this.getClass().getClassLoader().getResource(
					"plantillas/fichaJugador/Pictures");

			FileOutputStream fj;
			String s1 = ur.toString().replace("file:", "").replace("%20", " ");
			if (s1.contains(":/")) {
				s1 = s1.substring(1);
			}
			File tempFoto = new File(s1 + nombreFoto);
			tempFoto.delete();
			try {
				tempFoto.createNewFile();
				fj = new FileOutputStream(tempFoto);
				fj.write(jugador.getFoto());
				fj.close();
			} catch (IOException e2) {
				e2.printStackTrace();
			}
		} else {
			// no tiene ninguna foto subida
			nombreFoto = "sinFoto.png";
		}

		// Añadimos los datos al map
		map.put("temporada", temporada);
		map.put("nombre", nombre);
		map.put("nombreCompleto", nombreCompleto);
		map.put("fechaNacimiento", fechaNacimiento);
		map.put("lugarNacimiento", lugarNacimiento);
		map.put("demarcacion", demarcacion);
		map.put("estaturaPeso", estaturaPeso);
		map.put("equipoAct", equipoAct);
		map.put("historia", historia);
		map.put("palmares", palmares);
		map.put("nombreFoto", nombreFoto);

		// Cogemos la plantilla odt
		URL uri = this.getClass().getClassLoader().getResource(
				"plantillas/fichaJugador.odt");
		File file = null;

		try {
			file = new File(uri.toURI());
		} catch (URISyntaxException e1) {
			e1.printStackTrace();
		}

		try {
			// connect to an OpenOffice.org instance running on port 8100
			String host = ResourceBundle.getBundle("openoffice").getString(
					"host");
			int port = Integer.parseInt(ResourceBundle.getBundle("openoffice")
					.getString("port"));
			OpenOfficeConnection connection = new SocketOpenOfficeConnection(
					host, port);
			connection.connect();

			ByteArrayOutputStream out = new ByteArrayOutputStream();

			z = new ZippedDocumentTemplate(file);

			z.createDocument(map, out);
			byte[] b = out.toByteArray();

			// convert
			DocumentConverter converter = new StreamOpenOfficeDocumentConverter(
					connection);

			DocumentFormatRegistry registry = new DefaultDocumentFormatRegistry();
			DocumentFormat odt = registry.getFormatByFileExtension("odt");
			DocumentFormat pdf = registry.getFormatByFileExtension("pdf");

			ByteArrayOutputStream outpdf = new ByteArrayOutputStream();

			ByteArrayInputStream in = new ByteArrayInputStream(b);
			converter.convert(in, odt, outpdf, pdf);
			byte[] bpdf = outpdf.toByteArray();

			connection.disconnect();

			FacesContext faces = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) faces
					.getExternalContext().getResponse();

			String pdfname = "\"FichaJugador.pdf\"";
			response.setContentType("application/pdf");
			response.setContentLength(bpdf.length);
			response.setHeader("Content-disposition", "attachment; filename="
					+ pdfname);
			ServletOutputStream desc = response.getOutputStream();
			desc.write(bpdf);

			faces.responseComplete();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("No se puede abrir el archivo");
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Error de I/O");
			e.printStackTrace();
		} catch (DocumentTemplateException e) {
			// TODO Auto-generated catch block
			System.out.println("Error en la plantilla");
			e.printStackTrace();
		}

		return 0;

	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public StringBuffer getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(StringBuffer temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return
	 */
	public StringBuffer getNombreCompleto() {
		return nombreCompleto;
	}

	/**
	 * 
	 * @param nombreCompleto
	 */
	public void setNombreCompleto(StringBuffer nombreCompleto) {
		this.nombreCompleto = nombreCompleto;
	}

	/**
	 * 
	 * @return
	 */
	public String getFechaNacimiento() {
		return fechaNacimiento;
	}

	/**
	 * 
	 * @param fechaNacimiento
	 */
	public void setFechaNacimiento(String fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	/**
	 * 
	 * @return
	 */
	public StringBuffer getLugarNacimiento() {
		return lugarNacimiento;
	}

	/**
	 * 
	 * @param lugarNacimiento
	 */
	public void setLugarNacimiento(StringBuffer lugarNacimiento) {
		this.lugarNacimiento = lugarNacimiento;
	}

	/**
	 * 
	 * @return
	 */
	public String getDemarcacion() {
		return demarcacion;
	}

	/**
	 * 
	 * @param demarcacion
	 */
	public void setDemarcacion(String demarcacion) {
		this.demarcacion = demarcacion;
	}

	/**
	 * 
	 * @return
	 */
	public StringBuffer getEstaturaPeso() {
		return estaturaPeso;
	}

	/**
	 * 
	 * @param estaturaPeso
	 */
	public void setEstaturaPeso(StringBuffer estaturaPeso) {
		this.estaturaPeso = estaturaPeso;
	}

	/**
	 * 
	 * @return
	 */
	public String getEquipoAct() {
		return equipoAct;
	}

	/**
	 * 
	 * @param equipoAct
	 */
	public void setEquipoAct(String equipoAct) {
		this.equipoAct = equipoAct;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombreFoto() {
		return nombreFoto;
	}

	/**
	 * 
	 * @param nombreFoto
	 */
	public void setNombreFoto(String nombreFoto) {
		this.nombreFoto = nombreFoto;
	}

	/**
	 * 
	 * @return
	 */
	public List<String> getHistoria() {
		return historia;
	}

	/**
	 * 
	 * @param historia
	 */
	public void setHistoria(List<String> historia) {
		this.historia = historia;
	}

	/**
	 * 
	 * @return
	 */
	public List<String> getPalmares() {
		return palmares;
	}

	/**
	 * 
	 * @param palmares
	 */
	public void setPalmares(List<String> palmares) {
		this.palmares = palmares;
	}

}
